🎖️GitЯра🎖️
scripts/sort-strings.py docs/obtainium-generated-deeplinks (42f311dd) Text, 3.32 KB
Tff7b72import T7ee787xmlT7ee787.T7ee787etreeT7ee787.T7ee787ElementTree Tff7b72as T7ee787ET
Tff7b72import T7ee787os
Tff7b72import T7ee787re
T8b949e# Meshtastic String Sorter & Indexer
T8b949e# Usage: python3 scripts/sort-strings.py
T8b949e# This script alphabetizes strings.xml, adds prefix markers, and regenerates strings-index.txt.
Tff7b72def Td2a8ffsort_stringsTb4b4b4(Te6edf3xml_pathTb4b4b4, Te6edf3index_pathTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffReading Tffd700{Te6edf3xml_pathTffd700}Ta5d6ff...Ta5d6ff"Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3xml_pathTb4b4b4, Ta5d6ff'Ta5d6ffrTa5d6ff'Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4, Te6edf3newlineTff7b72=Ta5d6ff'Tffea00\nTa5d6ff'Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3content Tff7b72= Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
T8b949e# Extract license header
Te6edf3header_match Tff7b72= Te6edf3reTff7b72.Td2a8ffsearchTb4b4b4(Ta5d6ffrTa5d6ff'Ta5d6ff^(.*?)<resources>Ta5d6ff'Tb4b4b4, Te6edf3contentTb4b4b4, Te6edf3reTff7b72.Td2a8ffDOTALLTb4b4b4)
Te6edf3header Tff7b72= Te6edf3header_matchTff7b72.Td2a8ffgroupTb4b4b4(T79c0ff1Tb4b4b4) Tff7b72if Te6edf3header_match Tff7b72else Ta5d6ff'Ta5d6ff<?xml version=Ta5d6ff"Ta5d6ff1.0Ta5d6ff"Ta5d6ff encoding=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Ta5d6ff?>Tffea00\nTa5d6ff'
T8b949e# Parse XML
Te6edf3tree Tff7b72= Te6edf3ETTff7b72.Td2a8ffparseTb4b4b4(Te6edf3xml_pathTb4b4b4)
Te6edf3root Tff7b72= Te6edf3treeTff7b72.Td2a8ffgetrootTb4b4b4(Tb4b4b4)
T8b949e# Extract elements and their names
Te6edf3elements Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3child Tff7b72in Te6edf3rootTb4b4b4:
Te6edf3name Tff7b72= Te6edf3childTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff'Ta5d6ffnameTa5d6ff'Tb4b4b4)
Tff7b72if Te6edf3nameTb4b4b4:
Te6edf3elementsTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3nameTb4b4b4, Te6edf3childTb4b4b4)Tb4b4b4)
T8b949e# Sort elements by name
Te6edf3elementsTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3xTb4b4b4: Te6edf3xTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
T8b949e# Group by prefix
Te6edf3grouped_elements Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3nameTb4b4b4, Te6edf3element Tff7b72in Te6edf3elementsTb4b4b4:
Te6edf3prefix Tff7b72= Te6edf3nameTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff'Ta5d6ff_Ta5d6ff'Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Te6edf3prefix Tff7b72not Tff7b72in Te6edf3grouped_elementsTb4b4b4:
Te6edf3grouped_elementsTb4b4b4[Te6edf3prefixTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3grouped_elementsTb4b4b4[Te6edf3prefixTb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Te6edf3elementTb4b4b4)
T8b949e# Reconstruct XML and prepare Index
Te6edf3new_root Tff7b72= Te6edf3ETTff7b72.Td2a8ffElementTb4b4b4(Ta5d6ff'Ta5d6ffresourcesTa5d6ff'Tb4b4b4)
Te6edf3index_lines Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3sorted_prefixes Tff7b72= Tffa657sortedTb4b4b4(Te6edf3grouped_elementsTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3prefix Tff7b72in Te6edf3sorted_prefixesTb4b4b4:
Te6edf3group Tff7b72= Te6edf3grouped_elementsTb4b4b4[Te6edf3prefixTb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3groupTb4b4b4) Tff7b72>Tff7b72= T79c0ff5Tb4b4b4:
Te6edf3marker Tff7b72= Te6edf3prefixTff7b72.Td2a8ffupperTb4b4b4(Tb4b4b4)
Te6edf3new_rootTff7b72.Td2a8ffappendTb4b4b4(Te6edf3ETTff7b72.Td2a8ffCommentTb4b4b4(Ta5d6fffTa5d6ff'Ta5d6ff Tffd700{Te6edf3markerTffd700}Ta5d6ff Ta5d6ff'Tb4b4b4)Tb4b4b4)
Te6edf3index_linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff### Tffd700{Te6edf3markerTffd700}Ta5d6ff ###Ta5d6ff"Tb4b4b4)
Tff7b72for Te6edf3element Tff7b72in Te6edf3groupTb4b4b4:
Te6edf3new_rootTff7b72.Td2a8ffappendTb4b4b4(Te6edf3elementTb4b4b4)
Te6edf3index_linesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3elementTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff'Ta5d6ffnameTa5d6ff'Tb4b4b4)Tb4b4b4)
T8b949e# Pretty print helper
Tff7b72def Td2a8ffprettifyTb4b4b4(Te6edf3elemTb4b4b4, Te6edf3levelTff7b72=T79c0ff0Tb4b4b4)Tb4b4b4:
Te6edf3indent Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff"
Tff7b72if Tffa657lenTb4b4b4(Te6edf3elemTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3elemTff7b72.Td2a8fftext Tff7b72or Tff7b72not Te6edf3elemTff7b72.Td2a8fftextTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3elemTff7b72.Td2a8fftext Tff7b72= Ta5d6ff"Tffea00\nTa5d6ff" Tff7b72+ Tb4b4b4(Te6edf3level Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72* Te6edf3indent
Tff7b72if Tff7b72not Te6edf3elemTff7b72.Td2a8fftail Tff7b72or Tff7b72not Te6edf3elemTff7b72.Td2a8fftailTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3elemTff7b72.Td2a8fftail Tff7b72= Ta5d6ff"Tffea00\nTa5d6ff" Tff7b72+ Te6edf3level Tff7b72* Te6edf3indent
Tff7b72for Te6edf3iTb4b4b4, Te6edf3child Tff7b72in Tffa657enumerateTb4b4b4(Te6edf3elemTb4b4b4)Tb4b4b4:
Te6edf3prettifyTb4b4b4(Te6edf3childTb4b4b4, Te6edf3level Tff7b72+ T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3i Tff7b72< Tffa657lenTb4b4b4(Te6edf3elemTb4b4b4) Tff7b72- T79c0ff1Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3childTff7b72.Td2a8fftail Tff7b72or Tff7b72not Te6edf3childTff7b72.Td2a8fftailTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3childTff7b72.Td2a8fftail Tff7b72= Ta5d6ff"Tffea00\nTa5d6ff" Tff7b72+ Tb4b4b4(Te6edf3level Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72* Te6edf3indent
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3childTff7b72.Td2a8fftail Tff7b72or Tff7b72not Te6edf3childTff7b72.Td2a8fftailTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3childTff7b72.Td2a8fftail Tff7b72= Ta5d6ff"Tffea00\nTa5d6ff" Tff7b72+ Te6edf3level Tff7b72* Te6edf3indent
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3level Tff7b72and Tb4b4b4(Tff7b72not Te6edf3elemTff7b72.Td2a8fftail Tff7b72or Tff7b72not Te6edf3elemTff7b72.Td2a8fftailTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3elemTff7b72.Td2a8fftail Tff7b72= Ta5d6ff"Tffea00\nTa5d6ff" Tff7b72+ Te6edf3level Tff7b72* Te6edf3indent
Te6edf3prettifyTb4b4b4(Te6edf3new_rootTb4b4b4)
T8b949e# Write XML
Te6edf3xml_str Tff7b72= Te6edf3ETTff7b72.Td2a8fftostringTb4b4b4(Te6edf3new_rootTb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff'Ta5d6ffunicodeTa5d6ff'Tb4b4b4)
Te6edf3final_content Tff7b72= Te6edf3header Tff7b72+ Te6edf3xml_str Tff7b72+ Ta5d6ff'Tffea00\nTa5d6ff'
Tff7b72with Tffa657openTb4b4b4(Te6edf3xml_pathTb4b4b4, Ta5d6ff'Ta5d6ffwTa5d6ff'Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4, Te6edf3newlineTff7b72=Ta5d6ff'Tffea00\nTa5d6ff'Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3final_contentTb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSuccessfully sorted Tffd700{Te6edf3xml_pathTffd700}Ta5d6ff"Tb4b4b4)
T8b949e# Write Index
Tff7b72with Tffa657openTb4b4b4(Te6edf3index_pathTb4b4b4, Ta5d6ff'Ta5d6ffwTa5d6ff'Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4, Te6edf3newlineTff7b72=Ta5d6ff'Tffea00\nTa5d6ff'Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff'Tffea00\nTa5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3index_linesTb4b4b4) Tff7b72+ Ta5d6ff'Tffea00\nTa5d6ff'Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSuccessfully regenerated Tffd700{Te6edf3index_pathTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3xml_file Tff7b72= Ta5d6ff'Ta5d6ffcore/resources/src/commonMain/composeResources/values/strings.xmlTa5d6ff'
Te6edf3index_file Tff7b72= Ta5d6ff'Ta5d6ff.skills/compose-ui/strings-index.txtTa5d6ff'
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3xml_fileTb4b4b4)Tb4b4b4:
Te6edf3sort_stringsTb4b4b4(Te6edf3xml_fileTb4b4b4, Te6edf3index_fileTb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError: Tffd700{Te6edf3xml_fileTffd700}Ta5d6ff not found.Ta5d6ff"Tb4b4b4)
Served by rngit 1.4.2 - Generated in 0.07s